﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Text;
using System.IO;

namespace CSVGeneratorProject
{
    public class CSVGenerator
    {
        private string text = string.Empty;
        private int row_count = 0;

        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="header_columns">Массив имен столбцов</param>
        public CSVGenerator(params object[] header_columns)
        {
            this.AddRow(header_columns);
        }

        /// <summary>
        /// Добавляет строку
        /// </summary>
        /// <param name="row_columns">Массив значений для каждого столбца строки</param>
        public void AddRow(params object[] row_columns)
        {
            foreach (object column in row_columns)
            {
                text += column.ToString() + ";";
            }
            text += "\r\n";
            ++row_count;
        }

        /// <summary>
        /// Добавляет строку
        /// </summary>
        /// <param name="row_columns">Коллекция значений для каждого столбца строки</param>
        public void AddRow(System.Collections.IEnumerable row_columns)
        {
            foreach (object column in row_columns)
            {
                text += column.ToString() + ";";
            }
            text += "\r\n";
            ++row_count;
        }

        /// <summary>
        /// Добавляет пустую строку
        /// </summary>
        public void AddEmptyRow(int count_columns)
        {
            this.AddRow(string.Empty);
        }

        /// <summary>
        /// Возвращает содержимое файла в виде массива байт
        /// </summary>
        /// <returns></returns>
        public byte[] GetContentBytes()
        {
            System.Text.Encoding encod = Encoding.Unicode;
            return encod.GetBytes(this.text);
        }

        /// <summary>
        /// Возвращает содержимое файла в виде текста
        /// </summary>
        /// <returns></returns>
        public string GetContentText()
        {
            return this.text;
        }

        /// <summary>
        /// Возвращает длину содержимого файла (количество символов)
        /// </summary>
        /// <returns></returns>
        public int GetTextLength()
        {
            return this.text.Length;
        }

        /// <summary>
        /// Возвращает длину содержимого файла (количество байт)
        /// </summary>
        /// <returns></returns>
        public int GetBytesLength()
        {
            System.Text.Encoding encod = Encoding.Unicode;
            return encod.GetBytes(this.text).Length;
        }

        /// <summary>
        /// Возвращает общее количество строк в файле
        /// </summary>
        public int RowCount
        {
            get{ return this.row_count; }
        }

        /// <summary>
        /// Записывает содержимое в файл
        /// </summary>
        /// <param name="stream"></param>
        /// <returns></returns>
        public bool WriteToFile(Stream stream)
        {
            using (Stream fs = (Stream)stream)
            {
                try
                {
                    fs.Write(this.GetContentBytes(), 0, this.GetBytesLength());
                    fs.Close();

                    return true;
                }
                catch (Exception)
                {
                    return false;
                }
            }
        }
    }
}
